package editorsvg.propiedades;

import javax.swing.JComponent;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

/**
 * Propiedad que contiene un objeto Double.
 *
 * @author Jorge Berjano
 */
public class PropiedadNumericaReal extends Propiedad {
   // static final long serialVersionUID = Configuracion.version;
    
    private transient JSlider slider;
    private double minimo;
    private double maximo;    
    
    public PropiedadNumericaReal(Object objeto, String nombre) {
        super(objeto, nombre);
    }
    
    public PropiedadNumericaReal(Object objeto, String nombre, String alias) {
        super(objeto, nombre, alias);
    }
    
    @Override
    public Class getClase() {
        return Double.class;
    }
        
    public double getMinimo() {
        return minimo;
    }

    public void setMinimo(double minimo) {
        this.minimo = minimo;
    }

    public double getMaximo() {
        return maximo;
    }

    public void setMaximo(double maximo) {
        this.maximo = maximo;
    }
        
    public void rango(double min, double max) {
        setMinimo(min);
        setMaximo(max);
    }

    public String toString() {
        if (getValor() == null) {
            return "";
        } else {
            return obtenerNumeroReal().toString();
        }
        //return new Double(Math.round(obtenerNumeroReal() * 100.) / 100.).toString();
    }  
        
    public Double obtenerNumeroReal() {
        Object valor = getValor();
        if (valor instanceof Double)
            return (Double) valor;
        else
            return Double.NaN;
    }

    public void asignarNumeroReal(double valor) {
        setValor(new Double(valor));
    }

    public JComponent obtenerComponenteModificacion() {
        if (getMaximo() <= getMinimo()) 
            return null;
        
        if (slider == null) {
            slider = new JSlider((int) (getMinimo() * 100), (int) (getMaximo() * 100));
            int v = (int) obtenerNumeroReal().doubleValue();
            slider.setValue(v);
            slider.addChangeListener(new ChangeListener() {
                public void stateChanged(ChangeEvent evento) {
                    SliderAccionado();
                }
            });
        }
        return slider;
    }
    // Si se desliza el slider se actualiza el valor numerico
    private void SliderAccionado() {
        asignarNumeroReal((double) slider.getValue() / 100.0);
        //notificarCambios();
    }
    
    @Override
    public boolean permitirEditarTexto() {
        return true;
    }

    @Override
    public boolean parsearPropiedad(String valorString) {
        
        if (valorString.isEmpty()) {
            setValor(null);
            return true;
        }
        
        try {
            double numero = Double.parseDouble(valorString);
            asignarNumeroReal(numero);
            //notificarCambios();
        } catch (NumberFormatException ex) {
            return false;
        }
        
        return true;
    }


}
